Avant de parler de formatage, on parle souvent de concatnation.
La concatnation consiste mettre bout bout plusieurs chanes de caractres.
La concatnation peut se faire trs simplement avec l'oprateur mathmatique + :
protocole = "https://" nom_du_site = "Docstring" extension = "fr" url = protocole + "www." + nom_du_site + "." + extension
a fonctionne, mais trs rapidement vous allez observer deux problmes :
Ce n'est pas trs agrable lire.
Vous ne pouvez concatner que des objets du mme type (car Python est un langage fortement typ).
Ainsi, le code suivant retournera une erreur car la variable age est un nombre entier :
>>> age = 26 >>> phrase = "J'ai " + age + " ans." Traceback (most recent call last): File "<stdin>", line 1, in <module> TypeError: must be str, not int
Pour palier cette erreur, il faut convertir la variable age en chane de caractres :
>>> age = 26 >>> phrase = "J'ai " + str(age) + " ans." "J'ai 26 ans."
Et on retombe sur le premier problme : a devient trs vite difficile lire et c'est le meilleur moyen de se retrouver avec des TypeError.
Depuis la version 3.6 de Python, une fonctionnalit trs intressante a fait son apparition : les f-string.
Derrire ce nom un peu bizarre se trouve une faon trs efficace de formater des chanes de caractres.
C'est vrai autant pour la lisibilit que pour les performances, qui seront meilleures qu'avec la mthode format (a reste de l'ordre du millime de milliseconde mais tout de mme).
Pour utiliser les f-string, il suffit de rajouter la lettre f devant votre chane de caractres :
phrase = f"Je suis un f-string."
On peut ensuite, comme avec la mthode format, insrer des donnes dans la chane de caractres avec les accolades.
La diffrence majeure rside dans le fait qu'on peut crire du code Python directement dans les accolades.
On retrouve donc la flexibilit de la mthode format mais avec quelque chose d'encore plus facile lire.
Reprenons l'exemple de l'URL :
protocole = "https://"
nom_du_site = "Docstring"
extension = "fr"
url = f"{protocole}www.{nom_du_site}.{extension}" # https://www.Docstring.frVous souhaitez mettre le nom du site en minuscule ?
Aucun problme, on peut utiliser la mthode lower directement l'intrieur du f-string :
protocole = "https://"
nom_du_site = "Docstring"
extension = "fr"
url = f"{protocole}www.{nom_du_site.lower()}.{extension}" # https://www.docstring.frOn peut insrer n'importe quel type d'objet dans un f-string sans que cela ne pose de problme Python :
>>> liste = ['Pommes', 'Poires', 'Bananes']
>>> print(f"Voici votre liste de courses : {liste}")
Voici votre liste de courses : ['Pommes', 'Poires', 'Bananes']Et comme toujours, on peut crire du code Python directement l'intrieur des accolades :
>>> liste = ['Pommes', 'Poires', 'Bananes']
>>> print(f"Voici votre liste de courses : {', '.join(liste)}")
Voici votre liste de courses : Pommes, Poires, BananesPour viter les erreurs de type et insrer des objets dans une chane de caractres, on peut utiliser la mthode format.
Cette mthode permet d'insrer des objets l'intrieur d'emplacements spcifis dans la chane de caractres par des accolades :
age = 26
phrase = "J'ai {} ans".format(age)Ici, pas besoin de convertir la variable age en chane de caractres. La mthode format s'en charge pour nous et nous vitons ainsi le TypeError.
Cela permet galement de garder une certaine continuit dans notre chane de caractres qui ne se retrouve pas entrecoupe d'oprateurs +.
On peut galement spcifier l'intrieur des accolades un nom qu'on utilisera comme paramtre dans la mthode format pour obtenir une phrase encore plus claire :
age_de_lutilisateur = 26
phrase = "J'ai {age} ans".format(age=age_de_lutilisateur)On peut mettre autant d'emplacements dans une chane de caractres que ncessaire.
Il faudra cependant faire attention de passer autant d'lments la mthode format qu'il y a d'emplacements dans notre chane de caractres.
Par exemple, le code suivant fonctionne :
prenom = "Pierre"
age = 26
phrase = "Je m'appelle {} et j'ai {} ans.".format(prenom, age)Mais ci-dessous nous aurons une erreur (IndexError: tuple index out of range) car il y a deux emplacements dans la chane de caractres mais un seul lment est pass la mthode format :
prenom = "Pierre"
age = 26
phrase = "Je m'appelle {} et j'ai {} ans.".format(prenom)On peut galement spcifier l'intrieur des accolades un indice, qui fera rfrence la position de l'argument de la mthode format utiliser.
C'est trs pratique si vous souhaitez rutiliser un argument :
prenom = "Pierre"
age = 26
langage = "Python"
phrase = "Je m'appelle {0} et j'ai {1} ans. {0} apprends le langage {2}.".format(prenom, age, langage)
# Je m'appelle Pierre et j'ai 26 ans. Pierre apprends le langage Python.On peut galement remettre des noms l'intrieur des accolades afin d'obtenir quelque chose de plus agrable lire :
prenom = "Pierre"
age = 26
langage = "Python"
phrase = "Je m'appelle {prenom} et j'ai {age} ans. {prenom} apprends le langage {langage}.".format(prenom=prenom, age=age, langage=langage)Le nom que vous mettez l'intrieur des accolades n'a pas besoin d'tre le mme que la variable que vous passez la mthode format. On aurait trs bien pu faire :
prenom = "Pierre"
age = 26
langage = "Python"
phrase = "Je m'appelle {user} et j'ai {age} ans. {user} apprends le langage {learning}.".format(user=prenom, age=age, learning=langage)La mthode format permet donc d'obtenir un code beaucoup plus facile lire et vite de s'embter avec les fonctions de conversion.
Si on reprend l'exemple de l'URL du dbut de l'article :
protocole = "https://"
nom_du_site = "Docstring"
extension = "fr"
# Avec l'oprateur +
url = protocole + "www." + nom_du_site + "." + extension
# Avec la mthode format
url = "{}www.{}.{}".format(protocole, nom_du_site, extension)
url = "{protocole}www.{domaine}.{extension}".format(protocole=protocole,
domaine=nom_du_site,
extension="fr")La plupart du temps, les f-string sont beaucoup plus agrables lire et facile utiliser que la mthode format.
J'utilise 95% du temps les f-string mais il reste encore quelques cas de figure dans lesquels la mthode format est utile.
Le principal avantage de la mthode format est que vous pouvez dfinir votre chane de caractres un endroit de votre script et ne l'utiliser que plus tard.
Les f-string ncessitent que les variables que vous insrez dans votre chane de caractres soient disponible immdiatement.
Si vous essayez d'insrer dans un f-string une variable qui n'a pas encore t dclare, vous obtiendrez videmment une erreur :
>>> prenom = "Pierre"
>>> phrase = f"Bonjour {prenom}, cette semaine vous avez regard {nombre} vidos."
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'nombre' is not definedOr, il arrive que l'on dfinisse des chanes de caractres utiliser dans un fichier de configuration et que l'on souhaite utiliser ces phrases diffrents endroits de notre script avec des variables qui seront dfinies par la suite.
# constants.py
BONJOUR = "Bienvenue {prenom}, vous avez regard {nombre_videos} vidos cette semaine."
AU_REVOIR = " bientt {prenom} !"# main.py
from constants import BONJOUR
user = input("Entrez votre nom d'utilisateur : ")
progression = get_weekly_progress(user)
message_de_bienvenue = BONJOUR.format(prenom=user, nombre_videos=progression)
print(message_de_bienvenue)Ici, on dfinit des phrases afficher dans un fichier constants.py.
On utilise ensuite ces phrases en les formatant dans le script main.py.
On pourrait ainsi r-utiliser ces phrases dans plusieurs scripts sans avoir besoin de les rcrire chaque fois.